//
//  PhotoBrowserCell.swift
//  weibo.009
//
//  Created by mac on 15/9/20.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit

import SDWebImage
import SVProgressHUD

protocol PhotoBrowserCellDelegate: NSObjectProtocol{
    ///告诉控制器被缩放的比例
    func photoBrowserCellDidZooming(scale:CGFloat)
    /// 告诉控制器缩放完成
    func photoBrowserCellEndZoom()
}
class PhotoBrowserCell: UICollectionViewCell {
    weak var photoDelegate: PhotoBrowserCellDelegate?
    
    var url:NSURL?{
        didSet{
            //打开指示器
            indicator.startAnimating()
            resetScrollView()
            
            imageView.image = nil
            
            //提问：对于SDWebimage如果设置了image URL，图片会出现重用吗
            //原因：sdwebimage 一旦设置了url 和之前的url 不一致，会将image设置为nil
          dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(0 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
            // 之前 imageView 并没有指定大小
            // * RetryFailed 可以允许失败后重试
            // * RefreshCached 如果服务器的图像变化，而本地的图像是之前的图像，使用此选项，会更新服务器的图片
            //   GET 方法能够缓存，如果服务器返回的状态吗是 304，表示内容没有变化
            //   提交请求，如果是 304，就使用本地缓存，否则使用服务器返回的图片，具体内容看`网络视频`
            
           self.imageView.sd_setImageWithURL(self.url, placeholderImage: nil, options: [SDWebImageOptions.RetryFailed,SDWebImageOptions.RefreshCached]) { (image, error, _, _) -> Void in
            
            //关闭指示器
             self.indicator.stopAnimating()
            if error != nil{
                SVProgressHUD.showErrorWithStatus("你的网络不给力")
                return
                        }
    
             self.setImagePosition()
                
                }

            }
            
        }
    }
    
    ///重置 scrollView 的内容属性，因为缩放会影响到内容属性
    private func resetScrollView(){
        scrollView.contentSize = CGSizeZero
        scrollView.contentInset = UIEdgeInsetsZero
        scrollView.contentOffset = CGPointZero
        
        //重新设置imageView 形变属性
        imageView.transform = CGAffineTransformIdentity
    }
    /// 设置图像位置
    /**
    长短图
    
    如果图像缩放之后，没有屏幕高，显示在中间
    否则，显示在顶部，并且设置 contentSize 允许滚动
    */
    private func setImagePosition() {
        
        let size = displaySize(imageView.image!)
        imageView.frame = CGRect(origin: CGPointZero, size: size)
        // 短图
        if size.height < scrollView.bounds.height {
            let y = (scrollView.bounds.height - size.height) * 0.5
            
           // imageView.frame = CGRect(x: 0, y: y, width: size.width, height: size.height)
            scrollView.contentInset = UIEdgeInsets(top: y, left: 0, bottom: 0, right: 0)
        } else {    // 长图
         ///   imageView.frame = CGRect(origin: CGPointZero, size: size)
            
            scrollView.contentSize = size
        }
    }

    ///按照scrollView的宽度，计算缩放后的比例
    private func displaySize(image:UIImage) ->CGSize{
        //1，图像的宽高比
        let scale = image.size.height/image.size.width
        //2.计算高度
        let w = scrollView.bounds.width
        let h = w * scale
        
        return CGSize(width: w, height: h)
    }
     // MARK: - 构造函数，因为和屏幕一样大，只会被调用两次，后面再滚动就直接使用缓冲池中的 cell
    override init(frame: CGRect) {
        super.init(frame: frame)
        print(frame)
        
        setupUI()
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    ///设置控件
    private func setupUI(){
        //1，添加控件
        contentView.addSubview(scrollView)
        scrollView.addSubview(imageView)
        contentView.addSubview(indicator)
        
        //2,设置位置 - 让scrollView 和cell 一样大
        var rect = bounds
        rect.size.width -= 20
        scrollView.frame = rect
        indicator.center = scrollView.center
        
        prepareScrollView()
    }
    private func prepareScrollView(){
        //设置代理
        scrollView.delegate = self
        
        //设置最大和最小缩放比例
        scrollView.minimumZoomScale = 0.5
        scrollView.maximumZoomScale = 2.0
    }
    
    // MARK: - 懒加载控价
    /// 缩放图片
    private lazy var scrollView = UIScrollView()
    /// 显示单张图片
    lazy var imageView: UIImageView = {
        let iv = UIImageView()
        iv.contentMode = UIViewContentMode.ScaleAspectFill
        iv.clipsToBounds = true
        
        return iv
        }()
    ///菊花
    private lazy var indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
}

extension PhotoBrowserCell:UIScrollViewDelegate{
    ///告诉缩放scrollView缩放哪一个
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    
    /// 缩放完成后会被调用
    ///
    /// - parameter scrollView: scrollView
    /// - parameter view:       view - 被缩放的视图
    /// - parameter scale:      scale 缩放完成的比例
    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        var offSetY = (scrollView.bounds.height - imageView.frame.height) * 0.5
        var offSetX = (scrollView.bounds.width - imageView.frame.width) * 0.5
        
        //调整offSetY 避免 < 0之后，顶部看不到
        offSetY = (offSetY < 0) ? 0 : offSetY
        offSetX = (offSetX < 0) ? 0 : offSetX
        
        //重新设置间距
        scrollView.contentInset = UIEdgeInsets(top: offSetY, left: offSetX, bottom: 0, right: 0)
        
        //通知代理缩放完成
        photoDelegate?.photoBrowserCellEndZoom()
    }
    
    /// 只要缩放，就会被调用
    ///
    /// - parameter scrollView: scrollView
    /// 形变参数小结
    /// 1. a / d 决定 缩放比例
    /// 2. tx / ty 决定 位移
    /// 3. a b c d 共同决定旋转角度
    /// 修改形变的过程中，bounds 的数值不会发生变化
    /// frame 的数值会发生变化，bounds * transform => frame
    func scrollViewDidZoom(scrollView: UIScrollView) {
        print("-----------")
        print(imageView.transform)
        print(imageView.bounds)
        print(imageView.frame)
        
    photoDelegate?.photoBrowserCellDidZooming(imageView.transform.a)
    }
}
